package cz.vse.adventura.po1715.xkosd00_kostka.hra;

import java.util.Collection;
import static cz.vse.adventura.po1715.xkosd00_kostka.hra.Texty.*;


/*******************************************************************************
 * Instance třídy {@code PrikazOtevri} představuje příkaz používaný
 * k otevření nějakého předmětu. V dané hře je témto předmětem vždy okno
 * v 1. nebo 2. patře, ale obecně lze hru rozšířit o možnost otevření dalších
 * předmětů v dalších místnostech.
 *
 * @author    Dominik KOSTKA
 * @version   1.0
 */
public class PrikazOtevri extends APrikaz
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     *
     */
    public PrikazOtevri()
    {
        super( pOTEVŘI,
               "Otevře zadaný předmět. Předmět musí patřit mezi" +
               " objekty, které lze otevřít." );
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Otevře zadaný předmět; před tím však zkontroluje,
     * zda je zadán otevíraný předmět, zda tímto předmětem je 
     * okno v 1. nebo ve 2. patře
     * @param parametry Jediným povoleným parametrem je zatím okno
     * @return Text zpravy vypsane po porovedeni prikazu
     */
    @Override
    public String execute( String... parametry )
    {
        if (parametry.length == 0) return zPŘEDMĚT_NEZADAN;
        
        String název = parametry[0];
        
        if ((!název.equalsIgnoreCase(OKNO1)) &&
                (!název.equalsIgnoreCase(OKNO2)))
            return NELZE_OTEVŘÍT + název;
        
        Mistnost am = Mistnost.getAktuálníMístnost();
        Collection<Predmet> předměty = am.getObjects();
        boolean jePředmět = false;
        
        for (Predmet p : předměty) {
            String pr = p.getName();
            
            if (název.equalsIgnoreCase(pr)){
                jePředmět = true;
                break;
            }
        }

        if(!jePředmět) return zNENÍ_PŘEDMĚT + název;

        if((am == Mistnost.Patro1 && !Stav.světla1Svítí) ||
           (am == Mistnost.Patro2 && !Stav.světla2Svítí)) return JE_TMA;
        
        Mistnost cíl = Mistnost.getMístnost(název);
        Mistnost.setAktuálníMístnost(cíl);
        
        return OTEVŘENO + cíl;
    }
        

//    

//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTOVACÍ METODY A TŘÍDY ==================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        PrikazOtevri inst = new PrikazOtevri();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
